"""
优化版热点内容生成链 - 集成Prompt优化器
"""
from typing import Dict, List, Optional, Any, AsyncGenerator
import logging
from datetime import datetime

from ..prompts.prompt_optimizer import PromptOptimizer, optimize_hot_topic_prompts, PromptLayer
from ..loaders.hot_data import HotDataLoader
from ..models.router import ModelRouter

logger = logging.getLogger(__name__)


class OptimizedHotContentChain:
    """优化版热点内容生成链"""
    
    def __init__(self, mongodb_client, model_router: ModelRouter):
        self.mongodb_client = mongodb_client
        self.model_router = model_router
        self.hot_data_loader = HotDataLoader(mongodb_client)
        self.prompt_optimizer = PromptOptimizer()
        
    async def generate_hot_content(
        self,
        hot_item_id: str,
        platform: str,
        writing_angle: str = "news_report",
        user_prompt: str = "",
        model_name: str = "gpt-3.5-turbo",
        parameters: Optional[Dict] = None,
        template_prompt: str = "",
        **kwargs
    ) -> AsyncGenerator[str, None]:
        """
        生成热点内容 - 使用优化的Prompt合并
        
        Args:
            hot_item_id: 热点ID
            platform: 平台名称
            writing_angle: 写作角度
            user_prompt: 用户输入
            model_name: 模型名称
            parameters: 模型参数
            template_prompt: 模板提示词
        """
        try:
            # 1. 加载热点数据
            logger.info(f"Loading hot topic data: {hot_item_id} from {platform}")
            hot_item = await self.hot_data_loader.load_hot_item(hot_item_id, platform)
            
            if not hot_item:
                raise ValueError(f"Hot item not found: {hot_item_id}")
            
            # 2. 生成各层Prompt
            prompts = await self._generate_all_prompts(
                hot_item, writing_angle, user_prompt, template_prompt
            )
            
            # 3. 优化合并Prompt
            logger.info("Optimizing and merging prompts...")
            optimized_prompt = self.prompt_optimizer.optimize_prompts(prompts)
            
            logger.info(f"Optimized prompt length: {len(optimized_prompt)} chars")
            logger.info(f"Original total length: {sum(len(p) for p in prompts.values())} chars")
            
            # 4. 构建消息
            messages = [
                {"role": "user", "content": optimized_prompt}
            ]
            
            # 5. 生成内容
            logger.info(f"Generating content with model: {model_name}")
            async for chunk in self.model_router.generate_stream(
                model_name=model_name,
                messages=messages,
                parameters=parameters or {}
            ):
                yield chunk
                
        except Exception as e:
            logger.error(f"Error in optimized hot content generation: {str(e)}")
            raise
    
    async def _generate_all_prompts(
        self,
        hot_item: Dict,
        writing_angle: str,
        user_prompt: str,
        template_prompt: str
    ) -> Dict[PromptLayer, str]:
        """生成所有层级的Prompt"""
        
        # 1. Template Prompt (如果用户选择了模板)
        template_content = template_prompt or ""
        
        # 2. System Prompt (系统级角色和规范)
        system_content = self._generate_system_prompt(hot_item)
        
        # 3. Smart Prompt (AI智能生成)
        smart_content = await self._generate_smart_prompt(hot_item, writing_angle)
        
        # 4. Frontend Prompt (界面预设要求)
        frontend_content = self._generate_frontend_prompt(hot_item)
        
        # 5. User Input (用户输入)
        user_content = user_prompt or ""
        
        return {
            PromptLayer.TEMPLATE: template_content,
            PromptLayer.SYSTEM: system_content,
            PromptLayer.SMART: smart_content,
            PromptLayer.FRONTEND: frontend_content,
            PromptLayer.USER: user_content
        }
    
    def _generate_system_prompt(self, hot_item: Dict) -> str:
        """生成系统提示词"""
        return f"""你是一个专业的内容创作助手，专门基于热点话题进行创作。

当前热点信息：
- 标题：{hot_item.get('title', '')}
- 平台：{hot_item.get('platform', '')}
- 热度：{hot_item.get('heat_value', 0)}
- 摘要：{hot_item.get('summary', '')}
- 发布时间：{hot_item.get('publish_time', '')}

基本规范：
1. 保持客观性，避免偏见和不实信息
2. 确保内容的准确性和时效性
3. 遵循新闻伦理和社会责任
4. 语言表达清晰、逻辑严谨
5. 适当体现人文关怀
6. 避免煽动性和极端化表述"""
    
    async def _generate_smart_prompt(self, hot_item: Dict, writing_angle: str) -> str:
        """生成智能提示词"""
        
        # 分析话题敏感度
        sensitivity = self._analyze_topic_sensitivity(hot_item.get('title', ''))
        
        # 根据写作角度调整
        angle_config = self._get_writing_angle_config(writing_angle)
        
        # 生成智能提示
        smart_prompt = f"""针对热点"{hot_item.get('title', '')}"，撰写一篇{angle_config['name']}。

写作策略：{angle_config['strategy']}
语言风格：{angle_config['tone']}
结构建议：{' -> '.join(angle_config['structure'])}"""

        # 根据敏感度添加特殊指导
        if sensitivity == 'high':
            smart_prompt += "\n\n特别注意：此话题较为敏感，请格外谨慎，确保客观中立。"
        
        return smart_prompt
    
    def _generate_frontend_prompt(self, hot_item: Dict) -> str:
        """生成前端界面提示词"""
        return f"""请基于以下热点话题进行创作：

热点标题：{hot_item.get('title', '')}
平台来源：{hot_item.get('platform', '')}
热度排名：#{hot_item.get('rank', 'N/A')}

界面要求：
1. 深入分析热点背后的原因和影响
2. 提供独特的观点和见解
3. 内容要有深度，避免表面化
4. 适当引用相关数据和事例
5. 保持客观公正，多角度分析"""
    
    def _analyze_topic_sensitivity(self, title: str) -> str:
        """分析话题敏感度"""
        sensitive_keywords = ['事故', '死亡', '伤亡', '冲突', '争议', '丑闻']
        
        for keyword in sensitive_keywords:
            if keyword in title:
                return 'high'
        
        return 'normal'
    
    def _get_writing_angle_config(self, writing_angle: str) -> Dict:
        """获取写作角度配置"""
        configs = {
            'news_report': {
                'name': '新闻报道',
                'strategy': '客观报道事实，多方求证',
                'tone': '中性客观',
                'structure': ['事件概述', '背景分析', '各方观点', '影响评估']
            },
            'opinion_analysis': {
                'name': '观点分析',
                'strategy': '深度分析，理性评论',
                'tone': '理性分析',
                'structure': ['现象描述', '原因分析', '趋势判断', '建议措施']
            },
            'comprehensive_analysis': {
                'name': '综合分析',
                'strategy': '全面分析，多角度解读',
                'tone': '专业深入',
                'structure': ['背景介绍', '多维分析', '影响评估', '未来展望']
            }
        }
        
        return configs.get(writing_angle, configs['news_report'])


# 使用示例和测试
async def test_optimized_chain():
    """测试优化链"""
    
    # 模拟热点数据
    hot_item = {
        'title': '华南理工的被撞女生，集齐了所有悲伤点',
        'platform': 'weixin',
        'heat_value': 0,
        'summary': '',
        'rank': 1
    }
    
    # 模拟各层Prompt
    prompts = {
        PromptLayer.TEMPLATE: "你是一位专业的新闻记者，擅长撰写客观公正的新闻报道。",
        PromptLayer.SYSTEM: """你是一个专业的内容创作助手，专门基于热点话题进行创作。

当前热点信息：
- 标题：华南理工的被撞女生，集齐了所有悲伤点
- 平台：weixin
- 热度：0

基本规范：
1. 保持客观性，避免偏见和不实信息
2. 确保内容的准确性和时效性
3. 遵循新闻伦理和社会责任""",
        
        PromptLayer.SMART: """针对当前热议的华南理工的被撞女生，集齐了所有悲伤点话题，撰写一篇新闻报道。

创作要求：
1. 观点明确
2. 论证充分
3. 结构清晰
4. 语言流畅自然""",
        
        PromptLayer.FRONTEND: """请基于以下热点话题进行创作：

创作要求：
1. 深入分析热点背后的原因和影响
2. 提供独特的观点和见解
3. 内容要有深度，避免表面化
4. 保持客观公正，多角度分析""",
        
        PromptLayer.USER: "请写一篇关于这个事件的新闻报道，要求客观真实。"
    }
    
    # 优化Prompt
    optimizer = PromptOptimizer()
    optimized = optimizer.optimize_prompts(prompts)
    
    print("=== 优化前总长度 ===")
    total_original = sum(len(p) for p in prompts.values())
    print(f"总长度: {total_original} 字符")
    
    print("\n=== 优化后 ===")
    print(f"长度: {len(optimized)} 字符")
    print(f"压缩率: {(total_original - len(optimized)) / total_original * 100:.1f}%")
    print(f"\n内容:\n{optimized}")


if __name__ == "__main__":
    import asyncio
    asyncio.run(test_optimized_chain())
